Traditional data storage systems may increase the accessibility of data by caching frequently accessed regions of data in high performance storage systems (e.g., caches). Because caches are often more expensive than primary storage devices, traditional storage systems may have limited cache space and may only cache the most frequently-accessed regions of data. Furthermore, some caching systems implement caching in flash memory, and flash memory caching may be costlier (in terms of performance) that random-access-memory (RAM) caching. Thus, traditional caching systems may attempt to carefully select regions of data for caching to optimize system performance.
In an attempt to select the best regions of data to cache, traditional data storage systems may implement a policy of caching only regions of data with access rates that are higher than a predefined, static threshold. However, caching systems that use static thresholds may be inflexible and may fail to optimize the use of caches. For example, if access frequency for a set of data blocks is lower than a static threshold but higher than access frequencies of all other uncached data blocks, traditional systems may not cache the set of data blocks even when a cache has space for the blocks. Conversely, if a cache is full, traditional systems may be unable to cache some data blocks with access frequencies higher than a threshold, even if those data blocks have higher access rates than some cached data blocks. Furthermore, dealing with a full cache may result in thrashing, which may be particularly problematic in flash-based caches. What is needed, therefore, are improved systems and methods for utilizing and configuring data caches.